package me.mingshan.leetcode;

/**
 * https://leetcode.cn/problems/delete-nodes-from-linked-list-present-in-array/description/
 *
 * 3217. 从链表中移除在数组中存在的节点
 *
 * 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后，返回修改后的链表的头节点。
 *
 *
 *
 * 示例 1：
 *
 * 输入： nums = [1,2,3], head = [1,2,3,4,5]
 *
 * 输出： [4,5]
 *
 * 解释：
 *
 *
 *
 * 移除数值为 1, 2 和 3 的节点。
 *
 * 示例 2：
 *
 * 输入： nums = [1], head = [1,2,1,2,1,2]
 *
 * 输出： [2,2,2]
 *
 * 解释：
 *
 *
 *
 * 移除数值为 1 的节点。
 *
 * 示例 3：
 *
 * 输入： nums = [5], head = [1,2,3,4]
 *
 * 输出： [1,2,3,4]
 *
 * 解释：
 *
 *
 *
 * 链表中不存在值为 5 的节点。
 *
 * @author hanjuntao
 * @date 2025/7/31 0031
 */
public class L_3217_delete_nodes_from_linked_list_present_in_array {

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(3);
        head.next.next.next = new ListNode(4);
        head.next.next.next.next = new ListNode(5);

        ListNode.print(removeNodes(new int[]{3, 5}, head));
    }


    public static ListNode removeNodes(int[] vals, ListNode head) {
        ListNode curr = head;
        // 指向当前节点的前一个节点
        ListNode prev = null;

        while (curr != null) {
            boolean exist = false;
            for (int val : vals) {
                if (curr.val == val) {
                    exist = true;
                    break;
                }
            }

            if (exist) {
                ListNode next = curr.next;
                if (curr == head) {
                    head = next;
                } else {
                    prev.next = next;
                }

                curr.next = null;
                curr = next;
                // prev 不变
            } else {
                prev = curr;
                curr = curr.next;
            }

        }

        return head;
    }

}
